home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- /*
- * File: vidtmesh.c
- *
- * Simple demonstration of video on tmesh grid.
- * Uses much of 4Dgifts example, contcapt.c
- * for much of VL code
- * Also uses old rotimg.c code.
- *
- * last modified 12/16/93 atang
- * 2/28/94 atang add ripple, bumps, height, spin
- * 4/6/94 atang add even field capture
- */
-
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdlib.h>
-
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- #include <getopt.h>
- #include <sys/time.h>
- #include <gl/gl.h>
- #include <math.h> /* for rotate image wavy calculations */
- #include <gl/device.h>
- #include <gl/image.h>
-
- #include <vl/vl.h>
- #include <vl/dev_ev1.h>
-
- #define VL_PACKING_INVALID -1
- #define Debug if (debug) printf
- #define TIME_ARRAY_SIZE 400 /* MUST be divisible by 5! */
- #define TIME_GRANULARITY 1000
-
- void ProcessEvent(VLServer, VLEvent *, void *);
- void ProcessGlEvent(int, void *);
- int pause(void);
- void exitcapture(void);
-
- /*
- * Global variables
- */
- char *cmdargs = "Bb:c:DfFehi:mn:p:r:tv:wz:";
- char *usage_m =
- "usage: %s %s\n"
- "where arguments may be:\n"
- " -B source is blended video and gfx\n"
- " -b n use n buffers\n"
- " -D turn on debug mode (displays more information)\n"
- " -f fast (low res gfx on move) mode (e.g. for XL gfx)\n"
- " -e turn OFF even fields only mode\n"
- " -F field mode\n"
- " -n n device number n\n"
- " -o n video output source to use (depends on hardware)\n"
- " -p n set win position (1=upperLHS,0=lowerLHS(default))\n"
- " -h this help message\n"
- " -v n video input source to use (depends on hardware)\n"
- ;
-
- char *_progName;
- char *deviceName;
- int devicenum = -1;
- int ev1num = -1;
- int blended = 0;
- int buffers = 2;
- int packing = VL_PACKING_INVALID;
- int totalCount = 10000000;
- int debug = 0;
- int double_buffer = 1;
- int fast = 0;
- int fieldmode = 0;
- int evenfields = 1;
- int frameCount;
- int frameInterval = -1;
- int framenumber = 0;
- int lasttime = 0;
- int rate = 0;
- int secs;
- int time_array[TIME_ARRAY_SIZE];
- int time_on = 0;
- int xsize = 0;
- int ysize = 0;
- int zoom_num = 1, zoom_denom = 4; /* set zoom to 1/4 always */
- struct timeval tv_save;
- VLPath vlPath;
- VLServer vlSvr;
- VLNode drn;
- VLNode src;
- VLNode blend_node;
- VLBuffer transferBuf;
- int mywinposition = 0;
- int selfspin = 0;
- int spinspeed = 12;
- int repeat = 1;
- int ripple = 0;
- int backcolor = 0;
- float ripplespeed = 0.50;
- float height = 0.8;
- float mytranslate = 0.0;
- int input_timing;
- int vin = VL_ANY;
- int vout = VL_ANY;
- int vinflag = 0;
- int voutflag = 0;
-
-
- /* ---------------- start rotate image variables here */
- int lowres = 0;
-
- #define X 0
- #define Y 1
- #define Z 2
-
- unsigned short rb[2048];
- unsigned short gb[2048];
- unsigned short bb[2048];
-
- unsigned long *colors; /* used by draw_grid (colors to put on tmesh) */
- unsigned long *rgbout; /* used by load_frame (convert rgb data to colors) */
-
- float *grid;
- float wavymult = 1.0; /* used in wavy_grid to change function */
- int movewavy = 0;
- float wavyinc =0.0;
- float pi_over_xsize;
- float pi_over_ysize;
-
- float dist=0.0, d_dist=0.0;
- Angle azim=0, inc=0, twist=0;
- Angle d_azim=0, d_inc=0;
-
- short mx, my, omx, omy, nmx, nmy;
- long sizex, sizey;
- long origx, origy;
-
- short dev, val;
- int active=TRUE;
- long win;
- int menu;
-
- int low_res, low_tmp;
- int function=0;
- #define REORIENT 1
- #define REDISTANCE 2
-
- float ident_matrix[4][4] = {
- {1.0, 0.0, 0.0, 0.0},
- {0.0, 1.0, 0.0, 0.0},
- {0.0, 0.0, 1.0, 0.0},
- {0.0, 0.0, 0.0, 1.0},
- };
-
- int y, rotxsize=160, rotysize=120;
-
- IMAGE *image;
- char *title;
-
- /* --------------- end rotate image variables here */
- /* --------------- start rotate image routines here */
-
- reset_view(){
-
- if (evenfields) dist = ysize*2;
- else dist=ysize;
- azim=0; inc=0; twist=0;
- d_dist=0.0;
- d_azim=0; d_inc=0;
-
- return(0);
- }
-
- clear_color_grid() {
- int i, j;
-
- for (j=0; j<ysize; j++) {
- for (i=0; i<xsize; i++) {
- colors[j*xsize + i] = 0;
- }
- }
- return(0);
- }
-
-
- setup_wavy_grid() {
- int i, j;
- float a, b, x, y, r;
- r = xsize/4;
-
- for (j=0; j<ysize; j++) {
- b = (float) j * 3.14159265359 / ysize;
- if (!ripple)
- y = cos(b*3*repeat) * r;
- else
- y = r;
- for (i=0; i<xsize; i++) {
- a = (float) i * 3.14159265359 / xsize;
- x = cos(a*2.0*repeat) * r;
- grid[3 * (j*xsize + i) + 0] = i - xsize/2;
- grid[3 * (j*xsize + i) + 1] = j - ysize/2;
- grid[3 * (j*xsize + i) + 2] = height*((x + y)/3);
- }
- }
- }
-
-
- setup_flat_grid() {
-
- int ymult;
- int i, j;
-
- for (j=0; j<ysize; j++) {
- for (i=0; i<xsize; i++) {
- grid[3 * (j*xsize + i) + 0] = i - xsize/2;
- grid[3 * (j*xsize + i) + 1] = j - ysize/2;
- grid[3 * (j*xsize + i) + 2] = 0;
- }
- }
- }
-
- move_wavy_grid(){
-
- int i, j;
- float a, b, x, y, r;
- r = xsize/4;
-
- if (!ripple)
- {
- wavymult+= wavyinc;
- if (wavymult >= 0.6)
- if (wavymult >= 1) wavyinc = -0.05;
- else
- wavyinc = -0.15;
- if (wavymult <= -0.6)
- if (wavymult <= -1) wavyinc = 0.05;
- else
- wavyinc = 0.15;
- }else /* if ripple */
- {
- mytranslate = mytranslate + ripplespeed;
- }
- /* change the depth of the surface: */
- for (j=0; j<ysize; j++) {
- b = (float) j * pi_over_ysize;
- if (!ripple)
- y = cos(b*3*repeat) * r;
- else
- y = r;
- for (i=0; i<xsize; i++) {
- a = (float) i * pi_over_xsize;
- x = cos(mytranslate+a*2*repeat) * r;
- grid[3 * (j*xsize + i) + 2] = height*((x + y)/2)*wavymult;
- }
- }
- }
-
-
- draw_grid() {
-
- register int i, j;
- register float *gp1, *gp2;
- register unsigned long *cp1, *cp2;
-
- for (j=0; (j<ysize-1) && !qtest(); j++) {
-
- gp1 = &grid[3 * (j) * xsize];
- gp2 = &grid[3 * (j+1) * xsize];
- cp1 = &colors[j * xsize];
- cp2 = &colors[(j+1) * xsize];
-
- bgntmesh();
- for (i=0; i<xsize-1; i++) {
- cpack(*cp1++);
- v3f(gp1+=3);
- cpack(*cp2++);
- v3f(gp2+=3);
- }
- endtmesh();
- }
- }
-
- load_colors(unsigned short *row, unsigned long *dest, int xsize, int y, char c)
- {
- int pos;
-
- pos = xsize * y;
- dest = &dest[pos];
- switch (c) {
- case 'r':
- case 'R':
- while(xsize--) {
- *dest = *dest++ + *row++;
- }
- break;
- case 'g':
- case 'G':
- while(xsize--) {
- *dest = *dest++ + ((*row++) << 8);
- }
- break;
- case 'b':
- case 'B':
- while(xsize--) {
- *dest = *dest++ + ((*row++) << 16);
- }
- break;
- }
- }
-
-
- initialize() {
- int vidx,vidy;
-
- keepaspect(xsize, rotysize);
-
- if ((input_timing == VL_TIMING_625_SQ_PIX) ||
- (input_timing == VL_TIMING_625_CCIR601) ||
- (input_timing == VL_TIMING_625_4FSC))
- {/* PAL */
- vidx = 768;
- vidy = 576;
- }else
- {/* NTSC */
- vidx = 640;
- vidy = 486;
- }
- if (mywinposition == 1)
- {
- prefposition((long)0, (long)(vidx+10), (long)(1023-vidy), (long)1023);
- }else /* lower left */
- {
- prefposition ((long)0, (long)(vidx+10), (long)0, (long)(vidy));
- }
-
- win=winopen("Video T-Mesh");
-
- doublebuffer();
- RGBmode();
- gconfig();
- RGBcolor(0, 0, 0);
- clear(); swapbuffers(); clear();
-
- qdevice(INPUTCHANGE);
- qdevice(REDRAW);
- qdevice(ESCKEY);
- qdevice(SPACEKEY);
- qdevice(UPARROWKEY);
- qdevice(DOWNARROWKEY);
- qdevice(LEFTARROWKEY);
- qdevice(RIGHTARROWKEY);
- qdevice(WINQUIT);
- qdevice(WINSHUT);
- qdevice(LEFTMOUSE);
- qdevice(MIDDLEMOUSE);
- qdevice(RIGHTMOUSE);
-
- getorigin(&origx, &origy);
- getsize(&sizex, &sizey);
- zbuffer(TRUE);
- lsetdepth(0x00, 0x7fffff);
- clear_color_grid();
- setup_flat_grid();
- menu = defpup("Flat|Wavy|Go Wavy|Ripple (speeds: 'r' key)\
- |+ Height (up arrow)|- Height (down arrow)\
- |Bumps (spacebar)|Background Colors ('c' key)\
- |Spin On (speed: <- -> keys)\
- |Low Res Move|High Res Move\
- |Reset All|Quit");
- if (evenfields) dist = ysize*2;
- else dist=ysize;
- return(0);
- }
-
-
- /* code for reading from disk (not currently called) */
- read_img()
- {
- }
-
- draw_quick_grid(s)
- int s;
- {
-
- register int i, j, t;
- register float *gp1, *gp2;
- register unsigned long *cp1, *cp2;
-
- t = s * 3;
-
- for (j=0; (j<ysize-2) && !qtest(); j+=2) {
- gp1 = &grid[3 * j * xsize];
- gp2 = &grid[3 * (j+2) * xsize];
- cp1 = &colors[j * xsize];
- cp2 = &colors[(j+2) * xsize];
- bgntmesh();
- for (i=0; i<xsize-s; i+=s) {
- cp1+=s;
- cpack(*cp1);
- v3f(gp1 += t);
- cp2+=s;
- cpack(*cp2);
- v3f(gp2 += t);
- }
- endtmesh();
- }
- }
-
-
-
-
- draw_scene() {
-
- switch (backcolor)
- {
- default:
- case 1:
- RGBcolor(0, 0, 255);
- break;
- case 2:
- RGBcolor(0, 255, 0);
- break;
- case 3:
- RGBcolor(255, 0, 0);
- break;
- case 4:
- RGBcolor(255, 255, 255);
- break;
- case 0:
- RGBcolor(0, 0, 0);
- break;
- }
-
- clear();
- zclear();
-
- perspective(900, (float)sizex/(float)sizey, 1.0, 5000.0);
-
- if (selfspin)
- {
- azim = azim - spinspeed; /* for auto rotate clockwise */
- }
-
- /* inc = inc + 10; */ /* for auto tilting */
- /* polarview(dist + d_dist, azim + d_azim, inc + d_inc, twist); */
- /* XXX below: add 1800 to make up for reversed view... */
-
- if (evenfields) pushmatrix();
- polarview(dist + d_dist, azim + d_azim, 1800 + inc + d_inc, twist);
- if (evenfields) scale(1.0, 2.0, 1.0);
-
- if (movewavy) move_wavy_grid();
- if (lowres)
- {
- if (function || movewavy) draw_quick_grid(low_tmp=low_res);
- else {
- low_tmp = low_tmp/2;
- if (low_tmp>1) draw_quick_grid(low_tmp);
- else {draw_grid();
- low_tmp=0;
- }
- }
- }else /* end if lowres */
- draw_grid();
- if (evenfields) popmatrix();
- if (!qtest()) swapbuffers();
- }
-
-
- /* --------------- end rotate image routines here */
-
-
- void
- initStatistics(void)
- {
- if (!debug) return;
- gettimeofday(&tv_save);
- }
-
- void
- reportStatistics(void)
- {
- double rate;
- struct timeval tv;
- int delta_t;
-
- /* Delta_t in microseconds */
- delta_t = (tv.tv_sec*1000 + tv.tv_usec/1000) -
- (tv_save.tv_sec*1000 + tv_save.tv_usec/1000);
-
- rate = frameCount*1000.0/delta_t;
-
- printf("got %5.2f frames/sec\n", rate);
- tv_save.tv_sec = tv.tv_sec;
- tv_save.tv_usec = tv.tv_usec;
-
- }
-
- char *
- packing_name (int packtype)
- {
- switch (packtype)
- {
- case VL_PACKING_RGB_8:
- return "RGB";
- break;
-
- case VL_PACKING_RGBA_8:
- return "RGBA";
- break;
-
- case VL_PACKING_RBG_323:
- return "Starter Video RGB8";
- break;
-
- case VL_PACKING_RGB_332_P:
- return "RGB332";
- break;
-
- case VL_PACKING_Y_8_P:
- return "8 Bit Greyscale";
- break;
-
- default:
- return "???";
- break;
- }
- }
-
- getcmdargs(int argc, char **argv)
- {
- int c;
- int len, xlen, ylen;
- char numbuf[5];
- char *xloc;
-
- while ((c = getopt(argc, argv, cmdargs)) != EOF)
- {
- switch (c)
- {
-
- case 'b':
- buffers = atoi(optarg);
- break;
-
- case 'B':
- blended = 1;
- break;
-
- case 'c':
- totalCount = atoi(optarg);
- break;
-
- case 'D':
- debug = 1;
- break;
-
- case 'e':
- evenfields = 0;
- break;
-
- case 'f':
- lowres = 1;
- break;
-
- case 'F':
- fieldmode = 1;
- break;
-
- case 'g':
- len = strlen(optarg);
- xloc = strchr(optarg, 'x');
- if (!xloc)
- {
- printf("Error: invalid geometry format, using default size\n");
- break;
- }
- xlen = len - strlen(xloc);
- if (xlen < 1 || xlen > 4)
- {
- printf("Error: invalid x size, using default size\n");
- break;
- }
- strncpy(numbuf, optarg, xlen);
- xsize = atoi(numbuf);
-
- ylen = len - xlen -1;
- if (ylen < 1 || ylen > 4)
- {
- printf("Error: invalid y size, using default size\n");
- break;
- }
- strncpy(numbuf, &optarg[xlen + 1], ylen);
- ysize = atoi(numbuf);
- break;
-
- case 'i':
- frameInterval = atoi(optarg);
- printf("frameInterval = %d\n", frameInterval);
- break;
-
- case 'm':
- packing = VL_PACKING_Y_8_P;
- break;
-
- case 'n':
- devicenum = atoi(optarg);
- printf("User specified device number: %d\n", devicenum);
- break;
-
- case 'o':
- vout = atoi(optarg);
- voutflag = 1;
- Debug ("video output = %d\n", vout);
- break;
-
- case 'p':
- mywinposition = atoi (optarg);
- break;
-
- case 'r':
- rate = atoi(optarg);
- break;
-
- case 't':
- time_on = 1;
- break;
-
- case 'v':
- vin = atoi(optarg);
- vinflag = 1;
- Debug ("video input = %d\n", vin);
- break;
-
- case 'w':
- packing = VL_PACKING_RGB_8;
- break;
-
- case 'z': /* we're only supporting z 1/4 for now */
- break;
-
- case 'h':
- default:
- fprintf(stderr, usage_m, _progName, cmdargs);
- exit(0);
- break;
- }
- }
- }
-
- main(int argc, char **argv)
- {
- VLDevList devlist;
- char *deviceName;
- char window_name[128];
- char *xloc;
- long win;
- int c, i;
- int len, xlen, ylen;
- VLControlValue val;
-
- _progName = argv[0];
-
- getcmdargs(argc, argv);
-
- if (time_on)
- for (c = 0; c < 1000; c++)
- time_array[c] = 0;
-
- if (!(vlSvr = vlOpenVideo(""))) {
- printf("couldn't open video\n");
- exit(1);
- }
-
- if (vlGetDeviceList(vlSvr, &devlist) < 0) {
- printf("error getting device list: %s\n",vlStrError(vlErrno));
- exit(1);
- }
- /* find ev1 */
- for (i=0; i<devlist.numDevices; i++)
- if (strcmp(devlist.devices[i].name,"ev1") == 0)
- ev1num = i;
- if ( (ev1num == -1) /* no ev1 found ... OR ...*/
- || ((devicenum != -1) && (devicenum != ev1num))) /* non ev1 specified*/
- {
- printf("This program requires 'ev1' hardware.\a\n");
- if (ev1num != -1)
- printf("Use device number '%d', or use the default mode\n",ev1num);
- exit(1);
- }else
- {
- printf("Setting device number to %d\n", ev1num);
- devicenum = ev1num; /* allow default to work */
- }
-
- /* Set up a source node on the specified video source */
- if (vinflag == 0)
- src = vlGetNode(vlSvr, VL_SRC, VL_VIDEO, VL_ANY);
- else
- src = vlGetNode(vlSvr, VL_SRC, VL_VIDEO, vin);
-
- /* Set up a drain node in memory */
- if (voutflag == 0)
- drn = vlGetNode(vlSvr, VL_DRN, VL_MEM, VL_ANY);
- else
- drn = vlGetNode(vlSvr, VL_DRN, VL_MEM, vout);
-
- vlPath = vlCreatePath(vlSvr, devicenum, src, drn);
- if (vlPath < 0) {
- printf("can't create path: %s\n", vlStrError(vlErrno));
- exit(1);
- }
-
- /* Set up blend node if requested */
- if (blended)
- {
- blend_node = vlGetNode(vlSvr, VL_INTERNAL, VL_BLENDER, VL_ANY);
- if (vlAddNode(vlSvr, vlPath, blend_node) != 0)
- {
- vlDestroyPath(vlSvr, vlPath);
- vlPath = -1;
- vlPerror("Could not add blend node\n");
- }
- }
-
- if (vlSetupPaths(vlSvr, (VLPathList)&vlPath, 1, VL_SHARE, VL_SHARE) < 0){
- printf ("could not setup a vid to mem path\n");
- exit(1);
- }
-
- /* get the current input timing */
- vlGetControl(vlSvr, vlPath, src, VL_TIMING, &val);
- input_timing = val.intVal;
-
- /* get the name of the device we're using */
-
- deviceName = devlist.devices[devicenum].name;
- printf("Using device %d (%s)\n", devicenum, deviceName);
-
- /* specify what vlPath-related events we want to receive */
- val.fractVal.numerator = zoom_num;
- val.fractVal.denominator = zoom_denom;
- vlSetControl(vlSvr, vlPath, drn, VL_ZOOM, &val);
-
-
- /* Set the frame rate */
- if (rate)
- {
- val.intVal = rate;
- vlSetControl(vlSvr, vlPath, src, VL_RATE, &val);
- }
- vlGetControl(vlSvr, vlPath, src, VL_RATE, &val);
- Debug("frame rate = %d\n", val.intVal);
-
- /*
- * Specify what vlPath-related events we want to receive.
- * In this example we only want transfer complete events.
- */
- vlSelectEvents(vlSvr, vlPath, VLTransferCompleteMask|VLTransferFailedMask);
-
- /* Set up for even frame capture */
- if (evenfields)
- {
- val.intVal = VL_CAPTURE_EVEN_FIELDS;
- if (vlSetControl(vlSvr, vlPath, drn, VL_CAP_TYPE, &val) < 0)
- vlPerror("Seting VL_PACKING");
-
- /* Make sure non-interleaved capture is supported by the harware */
- if (vlGetControl(vlSvr, vlPath, drn, VL_CAP_TYPE, &val) < 0)
- vlPerror("Geting VL_PACKING");
- if (val.intVal != VL_CAPTURE_EVEN_FIELDS)
- fprintf(stderr,"Capture type not set to EVEN_FIELDS: %d\n",
- val.intVal);
- Debug("Field (even) mode\n");
- }
-
- /* Set up for non-interleaved frame capture */
- if (fieldmode)
- {
- val.intVal = VL_CAPTURE_NONINTERLEAVED;
- if (vlSetControl(vlSvr, vlPath, drn, VL_CAP_TYPE, &val) < 0)
- vlPerror("Seting VL_PACKING");
-
- /* Make sure non-interleaved capture is supported by the harware */
- if (vlGetControl(vlSvr, vlPath, drn, VL_CAP_TYPE, &val) < 0)
- vlPerror("Geting VL_PACKING");
- if (val.intVal != VL_CAPTURE_NONINTERLEAVED)
- fprintf(stderr,"Capture type not set to NONINTERLEAVED: %d\n",
- val.intVal);
- Debug("Field (non-interleaved) mode\n");
- }
-
- /* Set the video geometry */
- if (xsize) {
- val.xyVal.x = xsize;
- val.xyVal.y = ysize;
- vlSetControl(vlSvr, vlPath, drn, VL_SIZE, &val);
- }
- vlGetControl(vlSvr, vlPath, drn, VL_SIZE, &val);
- xsize = val.xyVal.x;
- ysize = val.xyVal.y;
- if (evenfields)
- ysize = ysize / 2;
- if (ysize == 243){
- ysize = ysize - 3;
- }
- if (ysize == 121){
- ysize = ysize - 1;
- }
- val.xyVal.x = xsize;
- val.xyVal.y = ysize;
- vlSetControl(vlSvr, vlPath, drn, VL_SIZE, &val);
- Debug("grabbing size %dx%d\n", xsize, ysize);
- vlGetControl(vlSvr, vlPath, drn, VL_SIZE, &val);
- printf("set SIZE to %d %d\n", val.xyVal.x, val.xyVal.y);
-
- /* -------------- start rotate image initialization here */
-
- pi_over_xsize = 3.14159265359 / xsize;
- pi_over_ysize = 3.14159265359 / ysize;
- colors = (unsigned long *)malloc(xsize*ysize*sizeof(unsigned long));
- grid = (float *)malloc(xsize * ysize * 3 * sizeof(int));
-
- initialize();
- fprintf(stderr, "\nUsing size %dx%d\n", xsize, ysize);
- low_tmp = low_res = (xsize+ysize)/100 +1;
-
- /* -------------- end rotate image initialization here */
-
-
- foreground();
- qdevice(RKEY);
- qdevice(CKEY);
- qdevice(QKEY);
- qdevice(SKEY);
-
- pixmode(PM_TTOB, 1);
-
- /* Set the packing type for the video board */
- if (packing != VL_PACKING_INVALID)
- {
- val.intVal = packing;
- if (vlSetControl(vlSvr, vlPath, drn, VL_PACKING, &val) < 0)
- vlPerror("Getting VL_PACKING");
- }
-
- /* Set the graphics to the same packing as the video board */
- vlGetControl(vlSvr, vlPath, drn, VL_PACKING, &val);
- packing = val.intVal;
- switch (val.intVal)
- {
- case VL_PACKING_Y_8_P:
- /*
- * XXX -gordo
- * this needs to restore the colormap
- */
- {
- int i;
-
- /* Use colormap mode for greyscale */
- cmode();
- for (i = 0; i < 256; i++)
- mapcolor(i, i, i, i);
- pixmode(PM_SIZE, 8); /* Pixels are 8 bit Greyscale */
- gconfig(); /* Reconfigure graphics */
- }
- break;
-
- case VL_PACKING_RGB_332_P:
- pixmode(PM_SIZE, 9); /* Pixels are 8 bit RGB */
- break;
-
- case VL_PACKING_RBG_323:
- pixmode(PM_SIZE, 8);
- break;
-
- /* Unknown packing type, use RGB as the default */
- default:
- packing = val.intVal = VL_PACKING_RGB_8;
- if (vlSetControl(vlSvr, vlPath, drn, VL_PACKING, &val) < 0)
- vlPerror("Setting RGB");
- vlGetControl(vlSvr, vlPath, drn, VL_PACKING, &val);
- Debug("packing type now is %s\n", packing_name(val.intVal));
- if (val.intVal != packing)
- {
- fprintf(stderr, "%s: Error, could not set Packing to %s", _progName,
- packing_name (packing));
- exit(1);
- }
- /*
- * There is no break here intentionally... the packing should
- * now be VL_PACKING_RGB, and thus should fall through...
- */
- case VL_PACKING_RGB_8:
- case VL_PACKING_RGBA_8:
- break;
- }
-
- vlGetControl(vlSvr, vlPath, drn, VL_SIZE, &val);
- if (xsize != val.xyVal.x || ysize != val.xyVal.y) {
- xsize = val.xyVal.x;
- ysize = val.xyVal.y;
- prefsize(xsize, ysize);
- winconstraints();
- reshapeviewport();
- Debug("after VL_PACKING size is now %dx%d\n", xsize, ysize);
- }
-
- /* Set up the ring buffer for data transfer */
- transferBuf = vlCreateBuffer(vlSvr, vlPath, drn, buffers);
-
- /* Associate the ring buffer with the path */
- vlRegisterBuffer(vlSvr, vlPath, drn, transferBuf);
-
- /* Set ProcessEvent() as the callback for a transfer complete event */
- vlAddCallback(vlSvr, vlPath, VLTransferCompleteMask|VLTransferFailedMask,
- ProcessEvent, NULL);
-
- vlRegisterHandler(vlSvr, qgetfd(), (VLEventHandler)ProcessGlEvent,
- (VLPendingFunc) qtest, (void *)win);
-
- if (vlBeginTransfer(vlSvr, vlPath, 0, NULL) < 0)
- {
- vlPerror("vlBeginTransfer");
- exit(1);
- }
-
- initStatistics();
-
- /* event loop */
-
-
- vlMainLoop();
-
- }
- void
- ProcessEvent(VLServer svr, VLEvent *ev, void *data)
- {
- int count;
- static int frameNum;
- static ulong lasttime = -1;
- static ulong lastsec;
- int timeDiff;
- DMediaInfo *dmInfo;
- VLInfoPtr info;
- char *dataPtr;
-
- /* Display the frame rate at a user specified interval */
- if (frameInterval > 0 && frameCount > frameInterval)
- {
- reportStatistics();
- frameCount = 0;
- }
-
- switch (ev->reason)
- {
- case VLTransferComplete:
- framenumber++;
-
- /* Get a pointer to the most recently captured frame */
- info = vlGetLatestValid(svr, transferBuf);
- if (!info)
- break;
-
- /* Get the valid video data from that frame */
- dataPtr = vlGetActiveRegion(svr, transferBuf, info);
-
- if (time_on)
- {
- dmInfo = vlGetDMediaInfo(svr, transferBuf, info);
- if (lasttime != -1)
- {
- timeDiff = (dmInfo->time.tv_sec - lastsec) * TIME_GRANULARITY;
- timeDiff += (int)(dmInfo->time.tv_usec - lasttime + 500) /
- (1000000 / TIME_GRANULARITY);
- if (timeDiff >= TIME_ARRAY_SIZE)
- timeDiff = TIME_ARRAY_SIZE-1;
- time_array[timeDiff] += 1;
- }
- lasttime = dmInfo->time.tv_usec;
- lastsec = dmInfo->time.tv_sec;
- }
-
- if (!fast)
- /* do some graphics here - this is part of the main loop */
- colors = (ulong *)dataPtr;
- draw_scene();
- /* start additional rotate image cases here */
- switch(function) {
- case REORIENT:
- mx = getvaluator(MOUSEX);
- my = getvaluator(MOUSEY);
- d_azim = (omx - mx) * 2 * getgdesc(GD_XPMAX) / sizex;
- /*XXX reversed to adjust for weird orient.,1800 added above */
- d_azim = - d_azim;
- d_inc = (my - omy) * 2 * getgdesc(GD_YPMAX) / sizey;
- draw_scene();
- break;
- case REDISTANCE:
- mx = getvaluator(MOUSEX);
- my = getvaluator(MOUSEY);
- d_dist = ((omx - mx) + (my - omy)) * getgdesc(GD_XPMAX) /sizex;
- draw_scene();
- break;
- } /* end switch(function) */
- /* end additional rotate image cases here */
-
- vlPutFree(svr, transferBuf);
- frameCount++;
- if (framenumber >= totalCount)
- exitcapture();
- break;
- case VLTransferFailed:
- printf("VL transfer failed\n");
- exitcapture();
- break;
- default:
- printf("Got Event %d\n", ev->reason);
- break;
- }
- }
-
-
- void
- ProcessGlEvent(int fd, void *win)
- {
- static short val;
- int loop;
- long device;
-
- while(qtest()){
- device = qread(&val);
- switch (device)
- {
-
- /* start rotate image cases here */
- case INPUTCHANGE:
- active = val;
- if (val);
- break;
- case LEFTMOUSE:
- mx = getvaluator(MOUSEX);
- my = getvaluator(MOUSEY);
- if (val) {
- function=REDISTANCE;
- /* setvaluators not doing what we need/expect right now esp w/move window*/
- /* setvaluator(MOUSEX, mx, origx+1, origx+sizex-1); */
- /* setvaluator(MOUSEY, my, origy+1, origx+sizey-1); */
- omx = mx; omy = my;
- } else {
- function=0;
- /* setvaluator(MOUSEX, mx, 0, XMAXSCREEN); */
- /* setvaluator(MOUSEY, my, 0, YMAXSCREEN); */
- dist += d_dist; d_dist = 0.0;
- draw_scene();
- }
- break;
- case MIDDLEMOUSE:
- mx = getvaluator(MOUSEX);
- my = getvaluator(MOUSEY);
- if (val) {
- function=REORIENT;
- /* setvaluator(MOUSEX, mx, origx+1, origx+sizex-1); */
- /* setvaluator(MOUSEY, my, origy+1, origx+sizey-1); */
- omx = mx; omy = my;
- } else {
- function=0;
- /* setvaluator(MOUSEX, mx, 0, XMAXSCREEN); */
- /* setvaluator(MOUSEY, my, 0, YMAXSCREEN); */
- azim += d_azim; d_azim = 0;
- inc += d_inc; d_inc = 0;
- draw_scene();
- }
- break;
- case RIGHTMOUSE:
- if (val) {
- switch (dopup(menu)) {
- case 1:
- movewavy = 0;
- setup_flat_grid();
- break;
- case 2:
- movewavy = 0;
- setup_wavy_grid();
- break;
- case 3:
- movewavy = 1;
- ripple = 0;
- setup_wavy_grid();
- break;
- case 4:
- movewavy = 1;
- ripple = 1;
- setup_wavy_grid();
- break;
- case 5:
- height = height + 0.1;
- setup_wavy_grid();
- break;
- case 6:
- height = height - 0.1;
- setup_wavy_grid();
- break;
- case 7:
- repeat = repeat + 1;
- if (repeat > 15)
- repeat = 1;
- setup_wavy_grid();
- break;
- case 8:
- backcolor = backcolor + 1;
- if (backcolor > 4)
- backcolor = 0;
- break;
- case 9:
- selfspin = 1;
- lowres = 0;
- break;
- case 10:
- lowres = 1;
- break;
- case 11:
- lowres = 0;
- break;
- case 12:
- reset_view();
- backcolor = 0;
- ripple = 0;
- ripplespeed = 0.50;
- repeat = 1;
- height = 0.8;
- selfspin = 0;
- spinspeed = 12;
- mytranslate = 0.0;
- wavymult = 1.0;
- movewavy = 0;
- setup_flat_grid();
- break;
- case 13:
- gexit(); /* add for graphics */
- exitcapture();
- break;
- }
- draw_scene();
- }
- break;
- case REDRAW:
- reshapeviewport();
- getorigin(&origx, &origy);
- getsize(&sizex, &sizey);
- draw_scene();
- break;
- /* end rotate image cases here */
-
- /* Toggle double buffer mode */
- case RKEY :
- if (val)
- {
- ripplespeed = ripplespeed + 0.1;
- if (ripplespeed > 1.2)
- ripplespeed = 0.1;
- }
- break;
- case CKEY :
- if (val)
- {
- backcolor = backcolor + 1;
- if (backcolor > 4)
- backcolor = 0;
- }
- break;
- case SPACEKEY:
- if (val)
- {
- repeat = repeat + 1;
- if (repeat > 15)
- repeat = 1;
- setup_wavy_grid();
- }
- break;
- case UPARROWKEY:
- height = height + 0.1;
- setup_wavy_grid();
- break;
- case DOWNARROWKEY:
- height = height - 0.1;
- setup_wavy_grid();
- break;
- case LEFTARROWKEY:
- if (val)
- {
- spinspeed = spinspeed - 3;
- break;
- }
- case RIGHTARROWKEY:
- if (val)
- {
- spinspeed = spinspeed + 3;
- break;
- }
- /* Quit capture */
- case QKEY :
- if (val != 1)
- break;
-
- case ESCKEY:
- case WINSHUT:
- case WINQUIT:
- gexit(); /* add for graphics */
- exitcapture();
- exit(0);
- break;
- } /* end switch */
- } /* end while qtest */
- /* additional processing (e.g. REORIENT, REDISTANCE) are */
- /* processed within the video processing loop */
- /* see ProcessEvent */
-
- }
-
- void
- exitcapture()
- {
- int loop, j;
-
- /* End the data transfer */
- vlEndTransfer(vlSvr, vlPath);
-
- /* Disassociate the ring buffer from the path */
- vlDeregisterBuffer(vlSvr, vlPath, drn, transferBuf);
-
- /* Destroy the path, free the memory it used */
- vlDestroyPath(vlSvr,vlPath);
-
- /* Destroy the ring buffer, free the memory it used */
- vlDestroyBuffer(vlSvr, transferBuf);
-
- /* Disconnect from the daemon */
- vlCloseVideo(vlSvr);
-
- /* Print the time stamps from the captured frames */
- if (time_on)
- for (loop = 0; loop < TIME_ARRAY_SIZE; ) {
- printf("%3d: ", loop);
- for (j = 0; j < 5; j++)
- printf("\t%d", time_array[loop++]);
- printf("\n");
- }
-
- exit(0);
- }
-
- /* === */
-